/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { createSelector } from 'reselect';

import { AppStore } from '@app/classes/models/store';
import { DataAvaibilityStatesModel } from '@modules/app-load/models/data-availability-state.model';
import { DataAvailabilityValues } from '@app/classes/string';
import { DataStateStoreKeys, baseDataKeys } from '@app/modules/app-load/services/app-load.service';

export const selectDataAvailabilityState = (state: AppStore): DataAvaibilityStatesModel => state.dataAvailabilityStates;

export const selectBaseDataAvailability = createSelector(
  selectDataAvailabilityState,
  (dataAvailabilityState: DataAvaibilityStatesModel): DataAvailabilityValues => {
    const values: DataAvailabilityValues[] = Object.keys(dataAvailabilityState)
          .filter((key: DataStateStoreKeys): boolean => baseDataKeys.indexOf(key) > -1)
          .map((key): DataAvailabilityValues => dataAvailabilityState[key]);
        let nextDataState: DataAvailabilityValues = DataAvailabilityValues.NOT_AVAILABLE;
        if (values.indexOf(DataAvailabilityValues.ERROR) > -1) {
          nextDataState = DataAvailabilityValues.ERROR;
        } else if (values.indexOf(DataAvailabilityValues.LOADING) > -1) {
          nextDataState = DataAvailabilityValues.LOADING;
        } else if ( values.filter((value: DataAvailabilityValues) => value !== DataAvailabilityValues.AVAILABLE).length === 0 ) {
          nextDataState = DataAvailabilityValues.AVAILABLE;
        }
        return nextDataState;
  }
);

export const isBaseDataAvailable = createSelector(
  selectBaseDataAvailability,
  (baseDataAvailabilityState: DataAvailabilityValues) => baseDataAvailabilityState === DataAvailabilityValues.AVAILABLE
);
